package com.ftg.learn.chapter06;

import com.sun.javafx.scene.control.skin.VirtualFlow;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 定长数组 ： 长度固定的
 * 1 ： {1,1,1,1,2,3,4,5,56,12,12,3,3,3,5,56,56,67,67,7,4,23,45,67,7,78}
 * 1.1 求这个数组里面所有2的倍数  int[]
 * <p>
 * 动态数组 : 可变长数组 , 数组
 * <p>
 * 封装成一个类  DynamicArray
 * <p>
 * 底层  : 数组
 * 初始长度  10
 * 扩容  1.5 * len
 * 最大长度
 * <p>
 * 面向对象 ： 50%  结果
 * <p>
 * 函数式 ：  50%   function abc(){}
 * <p>
 * 面向过程 : 100%  细节
 * <p>
 * <p>
 * <p>
 * 数据结构 ：线性存储结构 [数组 | 动态数组{自写}]
 * 连续 | 线性 元素在尾添加
 * <p>
 * 良好封装 : 所有不想让别人使用的方法|属性 全private
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/7/13 上午8:15
 */
public class DynamicArray {

    /**
     * 成员变量
     */
    private int init_capacity = 10;
    private int max_capacity = Integer.MAX_VALUE;

    private int[] bottom_array;

    /**
     * 索引 ： 用来存储数组元素时的下标
     */
    private int index = 0;

    /**
     * 成员方法
     * 构造方法  ： 与类名相同的方法 ,不能有返回値,什么时候执行 当有人new时
     */
    public DynamicArray() {
        bottom_array = new int[init_capacity];
    }

    /**
     * 用来完成把obj放到数组bottom_array里面的操作
     *
     * @param obj 使用者给我的数据
     * @return
     */
    public boolean add(int obj) {
        computeNewLength();
        bottom_array[index++] = obj;
        return true;
    }

    /**
     * 计算底层数组最后的扩展长度
     * 10 - 15
     */
    private void computeNewLength() {

        long newCapacity = bottom_array.length + (bottom_array.length >> 1);
        int lastCapacity = newCapacity > max_capacity ? max_capacity : (int) newCapacity;

        if (index == bottom_array.length) {
            bottom_array = Arrays.copyOf(bottom_array, lastCapacity);
        }
    }


    /**
     * 表示当前动态数组里面有多少个整数
     *
     * @return
     */
    public int size() {
        return index;
    }

    /**
     * 通过下标来获取元素内容
     *
     * @param index 下标
     * @return
     */
    public int get(int index) {
        return bottom_array[index];
    }

    /**
     * [1,2,3]
     * 删除 功能
     *
     * @param start
     * @return
     */
    public boolean delete(int start) {

        if (start >= index) {
            return false;
        }

        if (start == index - 1) {
            index--;
            return true;
        }
        for (int i = start; i < bottom_array.length - 1; i++) {
            bottom_array[i] = bottom_array[i + 1];
        }
        index--;
        return true;

    }

    public static void main(String[] args) {
        DynamicArray d = new DynamicArray();
        d.add(1);
        d.add(1);
        d.add(1);
        d.add(1);

        d.delete(0);

        for (int s = 0; s < d.size(); s++) {
            System.out.println(d.get(s));
        }

    }

}
